---
title: "Accidentes de transito en CR entre 2016-2022"
output: html_notebook
---

```{r, echo = FALSE}
data <- read.csv("accidentes_transito_con_victimas_2016_2022.csv", sep = ";")
```

```{r, echo = FALSE, warning = FALSE}
library(dplyr)
library(ggplot2)
library(plotly)
library(colorspace)
library(treemapify)
```

```{r, echo=FALSE, message = FALSE}
#obtenemos los meses, dias y la ruta donde
#mas accidentes hay
meses_dias_RU_mas_accidentes <- data %>%
  filter(grepl("^[A-L]\\..*\\s(Enero|Febrero|Marzo|Abril|Mayo|Junio|Julio|Agosto|Setiembre|Octubre|Noviembre|Diciembre)$", Mes)) %>%
  filter(grepl("^[1-7]\\.(Domingo|Lunes|Martes|Miércoles|Jueves|Viernes|Sábado)$", Día)) %>%
  group_by(Mes,Día,Ruta) %>%
  summarise(MDtotal_accidentes = n()) %>%
  arrange(desc(MDtotal_accidentes))

registros_mas_frecuentes <- meses_dias_RU_mas_accidentes %>%
  group_by(Mes) %>%
  slice(1)
  
numero_mes <- seq(1, 12, length.out = nrow(registros_mas_frecuentes))
numero_mes <- as.integer(numero_mes)
registros_mas_frecuentes <- cbind(registros_mas_frecuentes, NumeroMes = numero_mes)

# Crear una columna para el número de día según el día de la semana en registros_mas_frecuentes
registros_mas_frecuentes$ColorDia <-ifelse(registros_mas_frecuentes$Día == "1.Domingo", "blue",
                                            ifelse(registros_mas_frecuentes$Día == "2.Lunes", "red",
                                            ifelse(registros_mas_frecuentes$Día == "3.Martes", "yellow",
                                            ifelse(registros_mas_frecuentes$Día == "4.Miércoles", "cyan",
                                            ifelse(registros_mas_frecuentes$Día == "5.Jueves", "darkgreen",
                                            ifelse(registros_mas_frecuentes$Día == "6.Viernes", "brown",
                                            ifelse(registros_mas_frecuentes$Día == "7.Sábado", "black", NA)))))))

registros_mas_frecuentes$idRuta <-ifelse(registros_mas_frecuentes$Ruta == "Cantonal", 1)
                                          
registros_mas_frecuentes$Mes <- gsub("[A-L]\\.", "", registros_mas_frecuentes$Mes)

registros_mas_frecuentes$Día <- gsub("[1-7]\\.", "", registros_mas_frecuentes$Día)

```

```{r, echo = FALSE}
grafico_chernoff <- ggplot(registros_mas_frecuentes, aes(x = NumeroMes, y = idRuta,label1 = Mes,label2 = Ruta,label3 = Día)) +
  geom_point(size = 9,colour = registros_mas_frecuentes$ColorDia) +
  labs(x = "Mes",y = "Ruta") +
  geom_text(aes(label = "👁️ 👁️"),vjust = -5, size = 3)+  
  geom_text(aes(label = "👄"), vjust = 5, size = 2) +
  theme_bw()

# Convertimos el gráfico ggplot2 en uno interactivo con plotly
grafico_interactivo <- ggplotly(grafico_chernoff,tooltip = c("label1", "label2", "label3"))

# Mostramos el gráfico interactivo
grafico_interactivo

# 12 caras por los meses, color cara dias ... y tamanho cara ruta
```

```{r,echo=FALSE}
ruralUrbano_mas_accidentes<-data %>%
  group_by(Rural.o.urbano)%>%
  summarise(RUtotal_accidentes = n()) %>%
  arrange(desc(RUtotal_accidentes))
# desde 2016 hastas 2022
```

```{r,echo=FALSE}
labels = ruralUrbano_mas_accidentes$Rural.o.urbano
values = ruralUrbano_mas_accidentes$RUtotal_accidentes

fig <- plot_ly(type='pie', labels=labels, values=values, 
               textinfo='label+percent',
               insidetextorientation='radial')
fig <- fig %>% layout(title = 'Accidentes por ruta entre 2016-2022')

fig
```

```{r,echo=FALSE}
#y =mideplan x= canton
#tener canton con mas y menos accidentes
region_canton_mas_accidentes<-data%>%
  group_by(Región.Mideplan, Cantón)%>%
  summarise(RCtotal_accidentes = n(),.groups = "drop")

region_canton_mas_accidentes<-region_canton_mas_accidentes%>%
  group_by(Región.Mideplan, Cantón)%>%
  summarise(max_valor = max(RCtotal_accidentes),.groups = "drop")%>%
  arrange(max_valor)

# Número de colores deseado
n_colores <- 176

# Generar la paleta de colores

paleta_colores <-rainbow_hcl(n_colores) # Ejemplo de colores base
```

```{r,echo=FALSE}

fig <- plot_ly(region_canton_mas_accidentes, x = ~Región.Mideplan, y = ~max_valor, marker = list(color=paleta_colores) , type = 'bar',hovertemplate = ~paste("Región: ", Región.Mideplan, "<br>Cantón: ", Cantón, "<br>Valor: ", max_valor,
      "<extra></extra>"))

fig <- fig %>% layout(yaxis = list(title = ''),xaxis=list(title = ''), barmode = 'stack')

fig
```

```{r, echo = FALSE}
anioCTG<-data %>%
  group_by(Año,Tipo.de.circulación,Estado.del.tiempo,Clase.de.accidente) %>%
  summarise(NumeroAccidentes=n(),.groups="drop")

anioCTG<-anioCTG%>%
  group_by(Año,Tipo.de.circulación,Estado.del.tiempo,Clase.de.accidente)%>%
  summarise(Accidentes = min(NumeroAccidentes),.groups = "drop")%>%
  arrange(Accidentes)
anioCTG<-anioCTG%>%
  rename(Circulacion = Tipo.de.circulación)%>%
  rename(Clima = Estado.del.tiempo)%>%
  rename(Gravedad = Clase.de.accidente)

anioCTG$Año<-substr(anioCTG$Año, start = 3, stop = nchar(anioCTG$Año))
#elimino el 20 del año para que sea mejor la respresentación textual
#o sea en vez de 2016 sale 16
```

```{r,echo=FALSE}
faceInteractivo <- ggplot(anioCTG, aes(x=Circulacion, y=Accidentes, color=Clima, group=Gravedad)) +
    geom_point()+
    labs(x="Tipo de circulación",y="Cantidad accidentes",colour=" Estado del clima")+
  scale_y_continuous(limits = c(0, 2600), breaks = c(0, 2600))+
  theme(axis.text.x = element_text(angle = -45, hjust = 0),axis.text.y = element_text(angle=12))+
    facet_grid(Año ~ ., scale = "free_x",space = "free")
    

ggplotly(faceInteractivo)
```

```{r, echo = FALSE}
# Calcular la cantidad de accidentes por año
frecuencia_año <- table(data$Año)

# Crear un frame de datos con la frecienca y el año
datos_frecuencia_año <- data.frame(
  Año = names(frecuencia_año),
  Accidentes = as.numeric(frecuencia_año)
)

# Crear el grafico con un punto por cada año
puntos_año <- ggplot(datos_frecuencia_año, aes(x = Año, y = Accidentes, color = Año)) +
  geom_point(size = 5) +
  scale_x_discrete(breaks = NULL) +
  labs(y = "# de accidentes", 
       title = "Cantidad de accidentes por año") +
  theme(axis.title.x = element_blank(),
        axis.text.x = element_blank())

ggplotly(puntos_año)
```

```{r, echo = FALSE}
barras_hora <- ggplot(data, aes(x = Hora.recodificada, fill = Hora.recodificada)) +
  geom_bar() +
  labs(title = "Accidentes por Hora recodificada (rango de 6 horas)",
       x = "Hora Recodificada", y = "# de accidentes", fill = "Rango horario") +
  theme(axis.text.x = element_blank())

ggplotly(barras_hora)
```

```{r, echo = FALSE}
barras_tipo_clase <- ggplot(data, aes(x = Tipo.de.accidente, fill = Clase.de.accidente)) +
  geom_bar() +
  labs(title = "Tipos de heridos por tipo de accidente",
       x = "Tipo de accidente", y = "# de accidentes", fill = "Tipo de heridos") +
  theme(axis.text.x = element_text(angle = 315, hjust = 0))

ggplotly(barras_tipo_clase)
```
